package com.colin.app.activity.method;

import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;

import com.colin.app.app.AppActivity;
import com.colin.app.app.BasePresenterImpl;
import com.colin.app.bean.DemoBean;
import com.colin.library.help.permission.PermissionHelp;
import com.colin.library.listener.IAlertListCallBack;
import com.colin.library.other.Constants;

import java.io.File;

import static com.colin.library.other.Constants.IMAGE_UNSPECIFIED;

/**
 * Created by Colin on 2017/2/7.
 */

public class MethodPresenterImpl extends BasePresenterImpl implements MethodContract.MethodPresenter {

    private MethodContract.MethodView mMethodView;
    private MethodContract.MethodModel mMethodModel;

    public MethodPresenterImpl(AppActivity mAppActivity, MethodContract.MethodView mMethodView, DemoBean demoBean) {
        super(mAppActivity, mMethodView);
        this.mMethodView = mMethodView;
        this.mMethodModel = new MethodModelImpl(demoBean);
    }

    @Override
    public void setData() {
        mMethodView.setTitle(mMethodModel.getTitle());
    }


    @Override
    public void choosePhoto() {
        //第一步：权限管理
        if (!PermissionHelp.getInstance().checkPermission(mAppActivity, mMethodModel.getPermissionList())) {
            mMethodView.toastShow("请选择相应权限");
            return;
        }
        mMethodView.alertList(Constants.CHOSE_PHOTO_WAY, new IAlertListCallBack() {
            @Override
            public void alertCallBack(boolean is_ok, int position, Object o) {
                if (is_ok && position == 0) {
                    choosePhotoFromCamera();
                } else if (is_ok && position == 1) {
                    choosePhotoFromAlbum();
                }
            }
        });
    }

    @Override
    public boolean photoFileCreateSucceed() {
        return mMethodModel.photoFileCreateSucceed();
    }

    @Override
    public File getPhotoFile() {
        return mMethodModel.getPhotoFile();
    }

    @Override
    public void cropPhoto() {
        //之前设置文件路径与名字的转换成URI
        Uri uri = Uri.fromFile(mMethodModel.getPhotoFile());
        cropPhoto(uri);
    }

    /**
     * crop：String 类型数据，发送裁剪信号
     * aspectX 和 aspectY：int 类型数据，设置裁剪框的 X 与 Y 值比例
     * outputX 和 outputY：int 类型数据，设置裁剪输出的图片大小
     * scale：boolean 类型数据，设置是否支持裁剪缩放
     * return-data：boolean 类型数据，设置是否在 onActivityResult 方法的 intent 值中返回 Bitmap 对象
     * MediaStore.EXTRA_OUTPUT：Uri 类型数据，设置是否将裁剪结果保存到指定文件中
     *
     * @param uri
     */
    @Override
    public void cropPhoto(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
        //设置 return-data 参数为 true 时，返回的 Bitmap 对象也为缩略图，获取方式与前面所述相机拍照获取 Bitmap 的方式一致；
        intent.putExtra("crop", "true");
        //outputX 与 outputY 值设置太大时，容易出现卡屏现象；
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        //调用系统相册并裁剪时，如果使用MediaStore.EXTRA_OUTPUT参数，Uri 尽量不要设置为源文件对应的 Uri 值，另做保存，不损坏系统相册中的源图文件；
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mMethodModel.getPhotoFile()));
        mAppActivity.startActivityForResult(intent, Constants.REQUEST_CROP);
    }

    /**
     * 调用系统相机实现拍照
     * 其中 MediaStore.EXTRA_OUTPUT 数据表示，拍照所得图片保存到指定目录下的文件（一般会在 SD 卡中创建当前应用的目录，并创建临时文件保存图片）。
     * 然后，在 onActivityResult 方法中根据文件路径获取图片。
     * 如果不为 intent 添加该数据的话，将在 onActivityResult 的 intent 对象中返回一个 Bitmap 对象，通过如下代码获取：
     * Bitmap bmp = data.getParcelableExtra("data");这里的 Bitmap 对象是拍照所得图片的一个缩略图
     * <p>
     * 所以，调用系统相机时，一般都会添加 MediaStore.EXTRA_OUTPUT 参数
     * <p>
     * 拍照图片旋转问题
     */
    private void choosePhotoFromCamera() {
        //第一步：创建文件
        if (mMethodModel.photoFileCreateSucceed()) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mMethodModel.getPhotoFile()));
            mAppActivity.startActivityForResult(intent, Constants.REQUEST_CAMERA);
        }
    }


    private void choosePhotoFromAlbum() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
        mAppActivity.startActivityForResult(intent, Constants.REQUEST_ALBUM);
    }
}
